
package com.dyx.event;

/**
 * 事件的产生者，可看做事件源，EventProducer提供了监听容器listenerRegister，负责消费者的注册。
 *
 * 两点改进：
 * 1、EventProducter显式调用addListener方法，在方法里面可以创建匿名实现类；可以参考Android按钮添加监听器的思路。
 * 2、增加事件的队列分类，EventProducter通过Category进行归类注册。
 *
 * Event producer
 *
 * @author dengyouxu
 * @date 2021.06.01 09:33:10:871
 */
public class EventProducer {
    ListenerRegister register = new ListenerRegister();
    private int value;

    public int getValue() {
        return value;
    }

    /**
     * 在事件源中的某个行为来触发事件，
     * 1. 首先生成一个XXXEvent对象，是对该事件源的包装
     * 2. 由这个XXXEvent对象来触发监听器的动作
     *
     *
     * Sets value *
     *
     * @param newValue new value
     * @author dengyouxu
     * @date 2021.06.01 09:45:22:811
     */
    public void setValue(int newValue) {
        if (value != newValue) {
            value = newValue;
            ValueChangeEvent event = new ValueChangeEvent(this, value);
            fireAEvent(event);
        }
    }

    public void addListener(ValueChangeListener a) {
        register.addListener(a);
    }

    public void removeListener(ValueChangeListener a) {
        register.removeListener(a);
    }

    public void fireAEvent(ValueChangeEvent event) {
        register.fireAEvent(event);
    }

}